#!/usr/bin/python
import sys
from scapy.all import *
from datetime import datetime
import argparse


# ping(direccionURL) envia un paquete ICMP tipo ehco-request (ping) a la direccion direccionURL, 
# y devuelve el tiempo en que pasa entre que se envia el paquete y se recibe la respuesta 
def ping(direccionURL, TTL):
	# Armamos el paquete ICMP con la direccion de destitno deseada, y definimos su TTL (time-to-live)
	p=IP(dst=direccionURL,ttl=TTL)/ICMP(type='echo-request')
	
	# A continuacion, registramos el momento de envio, enviamos el paquete y registramos el momento de llegada
	base = datetime.now()
	resultado=sr1(p)
	tope = datetime.now()
	
	# A partir de los momentos de envio y llegada, calculamos el tiempo transcurrido 
	tiempoTranscurrido = tope - base
	return tiempoTranscurrido.microseconds * 0.001 #tiempo en segundos
	
# pingPromedio(direccionURL) realiza ping(direccionURL) n (1 default) veces y calcula el tiempo promedio 
def pingPromedio(direccionURL, TTL = 20, n = 1):
		tiempos=[]
		outputFile=open('traceroutePropio.log', 'w+')
		for i in range(0, n):
			# Para simplificar la lectura mostrada en pantalla, redirigimos stdout a un archivo, y luego 
			# imprimimos solo lo que nos interesa
			old_stdout = sys.stdout
			sys.stdout = outputFile
			tiempo = ping(direccionURL, TTL)
			tiempos.append(tiempo)
			sys.stdout = old_stdout
			print i, tiempo
			
		result = ( sum(tiempos) / n )
		return result

# Punto de entrada del script. 
if __name__ == '__main__':
	
	#Obtener direccionURL
	try:
		direccionURL = sys.argv[1]
	except:
		print 'Uso: traceroutePropio direccionnURL [nVecesPromedio]'
		exit()

	parser = argparse.ArgumentParser(description='Trabajo practico de Teoria de las Comunicaciones\n UBA - DC - 2013C2')
	parser.add_argument('-url', '-URL', help='URL', required=True)
	parser.add_argument('-ttl', '-TTL', help='TTL (default = 20)', required=False, default=20)
	parser.add_argument('-n','--nPromedio',help='Numero de veces para realizar el promdedio (default = 1)', required=False, default=1)
	args = parser.parse_args()
	
	res = pingPromedio(args.url, int(args.ttl), int(args.nPromedio))
	print res
